package leetcodeHis;

/**
 * 罗马数字包含以下七种字符： I， V， X， L，C，D 和 M。
   字符          数值
   I             1
   V             5
   X             10
   L             50
   C             100
   D             500
   M             1000

   例如， 罗马数字 2 写做 II ，即为两个并列的 1。12 写做 XII ，即为 X + II 。 27 写做  XXVII, 即为 XX + V + II 。

   通常情况下，罗马数字中小的数字在大的数字的右边。但也存在特例，例如 4 不写做 IIII，而是 IV。数字 1 在数字 5 的左边，所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地，数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况：

   I 可以放在 V (5) 和 X (10) 的左边，来表示 4 和 9。
   X 可以放在 L (50) 和 C (100) 的左边，来表示 40 和 90。 
   C 可以放在 D (500) 和 M (1000) 的左边，来表示 400 和 900。
   给定一个整数，将其转为罗马数字。输入确保在 1 到 3999 的范围内。
 */
public class Algo_12_整数转罗马数字 {
    public static String intToRoman(int num) {
        StringBuilder result = new StringBuilder();
        String one = "I";
        String five = "V";
        String ten = "X";
        String fifty = "L";
        String hundred = "C";
        String fiveHun = "D";
        String thousand = "M";


        if(num/1000>0) {
            for (int i = 0; i < num / 1000; i++) {
                result.append(thousand);
            }
            num %= 1000;
        }
        if((num/100)>0) {
            int i = num/100;
            if(i >= 5) {
                if( i == 9) {
                    result.append(hundred).append(thousand);
                } else if ( i==5) {
                    result.append(fiveHun);
                }
                else {
                    result.append(fiveHun);
                    for (int i1 = 0; i1 < i - 5; i1++) {
                        result.append(hundred);
                    }
                }
            }else {
                if(i==4) {
                    result.append(hundred).append(fiveHun);
                }else {
                    for (int i1 = 0; i1 < i; i1++) {
                        result.append(hundred);
                    }
                }
            }
            num %= 100;
        }
        if(num/10>0) {
            int i = num/10;
            if(i >= 5) {
                if( i == 9) {
                    result.append(ten).append(hundred);
                }else if(i == 5) {
                    result.append(fifty);
                } else {
                    result.append(fifty);
                    for (int i1 = 0; i1 < i - 5; i1++) {
                        result.append(ten);
                    }
                }
            }else {
                if(i==4) {
                    result.append(ten).append(fifty);
                }else {
                    for (int i1 = 0; i1 < i; i1++) {
                        result.append(ten);
                    }
                }
            }
            num %= 10;
        }
        if(num>0) {
            if(num >= 5) {
                if( num == 9) {
                    result.append(one).append(ten);
                }else if(num == 5) {
                    result.append(five);
                } else {
                    result.append(five);
                    for (int i1 = 0; i1 < num - 5; i1++) {
                        result.append(one);
                    }
                }
            }else {
                if(num==4) {
                    result.append(one).append(five);
                }else {
                    for (int i1 = 0; i1 < num; i1++) {
                        result.append(one);
                    }
                }
            }
        }
        return result.toString();
    }

    public static void main(String[] args) {
        int three = 3;
        int four = 4;
        int five = 5;
        int a = 58;
        int b = 1994;
        System.out.println(intToRoman(three));
        System.out.println(intToRoman(four));
        System.out.println(intToRoman(five));
        System.out.println(intToRoman(a));
        System.out.println(intToRoman(b));
    }
}
